package easy;

/**
 * 在 MATLAB 中，有一个非常有用的函数 reshape ，它可以将一个m x n 矩阵重塑为另一个大小不同（r x c）的新矩阵，但保留其原始数据。
 * 给你一个由二维数组 mat 表示的m x n 矩阵，以及两个正整数 r 和 c ，分别表示想要的重构的矩阵的行数和列数。
 * 重构后的矩阵需要将原始矩阵的所有元素以相同的 行遍历顺序 填充。
 * 如果具有给定参数的 reshape 操作是可行且合理的，则输出新的重塑矩阵；否则，输出原始矩阵。
 * 示例：
 *      输入：mat = [[1,2],[3,4]], r = 1, c = 4
 *      输出：[[1,2,3,4]]
 *
 *      输入：mat = [[1,2],[3,4]], r = 2, c = 4
 *      输出：[[1,2],[3,4]]
 */
public class leetcode566 {
    public static void main(String[] args) {
        int[][] arr = {{1,2},{3,4}};
        int[][] newArr = matrixReshape(arr, 1, 4);
        for (int i = 0; i < newArr.length; i++) {
            for (int j = 0; j < newArr[i].length; j++) {
                System.out.print(newArr[i][j] + " ");
            }
            System.out.println();
        }
    }
    public static int[][] matrixReshape(int[][] mat, int r, int c) {
        // 使用了双for循环加双指针
        if ((mat != null && mat[0] != null) && ((r * c) == (mat.length * mat[0].length))) {
            // 定义一个存储重塑后的矩阵
            int[][] newMat = new int[r][c];
            // 定义行指针和列指针
            int rIndex = 0,cIndex = 0;
            // 遍历给定矩阵
            for (int i = 0; i < mat.length; i++) {
                for (int j = 0; j < mat[i].length; j++) {
                    // 当列指针的大小长度小于列的长度时，将原矩阵的值赋值给当前列指针的位置，列指针++
                    if (cIndex < newMat[rIndex].length){
                        newMat[rIndex][cIndex++] = mat[i][j];
                    } else if (cIndex == newMat[rIndex++].length){ // 当列指针等于列的长度时，表示该换行，行指针++，重新把列指针变为0，j--
                        cIndex = 0;
                        j--;
                    }
                }
            }
            return newMat;
        }
        return mat;
    }
}
